import java.util.LinkedList;

public class Expression {
	//listExpr = a0,a1,a2,...,a(n-1),c
	//variable = x0,x1,x2,....,x(n-1)
	//expression = "(+ or -)c+a0*x0+..."
	//valeur = fonction(x0,x1,x(n-1))=(+ or -)c+a0*x0+...
	LinkedList<Double> listExpr;
//	double valeur;
	
	public Expression(){listExpr = new LinkedList<Double>();}
	public Expression(LinkedList<Double> ll){
		listExpr = ll;
	}
	
	public Expression(String s,EnsembleVariable ev){
		listExpr= new LinkedList<Double>();
		int j =0;
		double res[] = readDouble(s);
		double constant = res[0];
	//	listExpr.add(j,res[0]);
		s = s.substring((int)res[1]);
		
		while(j<ev.size()){
			res = readDouble(s);
			listExpr.add(j,res[0]);	
	//		s = s.substring((int)res[1]+2);	//on suppose que le longueur de nom = 1
			s = s.substring((int)res[1]+1+ev.getVariable(j).nom.length());
			j++;
		}
		listExpr.add(ev.size(),constant);
	}
	

	
	public static double[] readDouble(String s){
		//lire un entiere. renvoyer result[]={valeur d,position de pointer i}
		int carLu;
		int sign=1;
		int d = 0;
		int i=0;
		
		double result[]=new double[2];
		carLu = s.charAt(i);
		if(carLu == (int)'+') sign = 1;
		else sign = -1;
	
		i++;
		carLu=s.charAt(i);
		
		while("+-*".indexOf(carLu)==-1){		
		    d=10*d+(carLu-'0');
			i++;
			carLu = s.charAt(i);
		}
		result[0]=sign*d;
		result[1]=i;
		return result;
	}
	
	public double fonction(EnsembleVariable ens){
		double tmp = 0;
		int l = listExpr.size();
		for(int i=0; i<l-1;i++ ){
			tmp+=listExpr.get(i)*ens.getVariable(i).valeur;
		}
		tmp = tmp + listExpr.get(l-1);
		return tmp;
	}
	
	public void publish(EnsembleVariable ev){
		int l = ev.size();
		System.out.print("Expr:");
		for(int j = 0;j<l+1;j++){
			System.out.print(listExpr.get(j)+" ");
		}
//		System.out.println();
	}
}